// 计算器
// class MyCalculator {
//   constructor(value) {
//     // this指向实例化对象
//     this.value = value
//   }
//
//   add(newValue) {
//     // this ==> 调用者？
//     this.value = this.value + newValue
//     // 每一次计算的时候都需要return实例化对象出去
//     // 每一次计算完成都需要得到一个实例化对象
//     return this
//   }
//
//   reduction(newValue) {
//     this.value = this.value - newValue
//     return this
//   }
//
//   multiply(newValue) {
//     this.value = this.value * newValue
//     return this
//   }
//
//   division(newValue) {
//     this.value = this.value / newValue
//     return this
//   }
// }
//
// // Number的prototype的去写方法
// const a = 1
// // Number.prototype.add = function(value) {
// //   return this + value
// // }
// // 返回一个数字，同时返回的数字还能调用实例化对象的方法
// a.toFixed()
// // 如果获取到的a直接是一个数字，那他就没有add这些方法了
// const num = new MyCalculator(1) // new一个类的时候，传进去的值去哪了？
// console.log(num)
// // 方法调用的时候
// const { value } = num.add(2).reduction(2).multiply(5).division(2).multiply(2).add(2)
// console.dir(value)
//
// // const ab = '1'
// // console.log(window.ab)
// // console.log(ab)
// // debugger
// // // ab()
// //
// // // 使用let和const定义的变量并没有挂载到window上，而是有一个单独的script作用域，存储变量
// // // 只有var的会在window上
// //
// // const len = 29
// //
// // const obj = {
// //   getLen() {
// //     return this.len // 29?
// //   }
// // }
// //
// // const test = obj.getLen
// //
// // test()
// // 函数的单独调用的时候，并不是说由window调用的才指向window
// var c = 20
// const obj = {
//   b() {
//     console.log(this.c)
//   }
// }

// this指向规则
// 普通函数：调用的方式决定你的this指向 (使用function定义的函数)
// 1、new调用，指向的是实例化对象(创建的对象)
// 2、使用call,apply,bind绑定的时候指向的是绑定的对象
// 3、通过对象调用函数，指向的是这个对象
// 4、默认规则：全局对象(浏览器环境下面(非严格模式)，全局对象是window。严格模式，全局对象是undefined)
// window调用

// 123的规则匹配不到的时候就会走默认指向，最常见的函数的单独调用
// node和浏览器全局对象是不一致的，同时严格模式下面全局对象是undefnied

function foo() {
  const a = 'a'
  function bar() {
    console.log(this)
    console.log(this.a) // 打印什么？
  }
  bar() // 也是函数的单独调用
}

foo()
